package co.edu.javeriana.negocio;

import co.edu.javeriana.comunicacion.Constantes;
import co.edu.javeriana.comunicacion.MCliente;
import co.edu.javeriana.presentacion.MainWindow;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

public class Estacion {

    public static int MAX_ELEMENTS = 10;
    MainWindow ventana;
    Lector lectorSensor;
    ArrayList lecturas;
    ArrayList lecturasRemotas;
    long frecuencia;
    MCliente cliente;
    ArrayList<String> observadores;
    String estacionSeleccionada;

    public ArrayList getLecturas() {
        return lecturas;
    }

    public Estacion(MainWindow mw) {
            estacionSeleccionada=Constantes.ESTACION;
            lecturas = new ArrayList();
            lecturasRemotas = new ArrayList();
            observadores = new ArrayList();
            frecuencia = 15;
            for (int i = 0; i < MAX_ELEMENTS; i++) {
                lecturas.add((Double) 0.0);
                lecturasRemotas.add((Double) 0.0);
            }
            ventana = mw;
            lectorSensor = new Lector(frecuencia);
            lectorSensor.addObserver(new Observer() {
                @Override
                public void update(Observable unObservable, Object dato) {
                    //System.out.println (dato);
                    nuevoDato((Double) dato);
                    for(String observadorRemoto:observadores){
                        cliente.enviarTrama(2, ((Double)dato).toString()+",,"+observadorRemoto);
                    }
                }
            });
            //Se registra ante el despachador
            registrarse();
    }
        
    public void nuevoDato(Double dato) {
        lecturas.add(dato);
        if (lecturas.size() > MAX_ELEMENTS) {
            lecturas.remove(0);
        }
        if(estacionSeleccionada.equals(Constantes.ESTACION)){
            ventana.repintarGrafico(lecturas);
        }
    }
    
    public void nuevoDatoRemoto(Double dato) {
        lecturasRemotas.add(dato);
        if (lecturasRemotas.size() > MAX_ELEMENTS) {
            lecturasRemotas.remove(0);
        }
        if(!estacionSeleccionada.equals(Constantes.ESTACION)){
            ventana.repintarGrafico(lecturasRemotas);
        }
    }

    public void setFrecuencia(long nueva) {
        frecuencia = nueva;
        lectorSensor.setFrecuencia(nueva);
    }

    public long getFrecuencia() {
        return frecuencia;
    }
    
    private void registrarse(){
        if(cliente == null){
            cliente = new MCliente(Constantes.PUERTO, Constantes.URL, Constantes.ESTACION, this);
            cliente.start();
        }
    }
    
    public void addEstacion(String s){
        ventana.addEstacion(s);
    }
    
    public void delEstacion(String s){
        ventana.delEstacion(s);
    }
    
    public void cambiarFrecuencia(int frecuencia){
        setFrecuencia(frecuencia);
        ventana.cambiarFrecuencia(frecuencia);
    }
    
    public void consultarTemperatura(String trama){
        estacionSeleccionada = trama;
        cliente.enviarMensaje("CT,"+Constantes.ESTACION+","+trama);
    }
    
    public void enviarFrecuencia(long nueva){
        cliente.enviarTrama(4,String.valueOf(nueva));
    }
    
    public void desconectar(){
        cliente.enviarTrama(3, "");
        cliente.interrupt();
        cliente.close();
    }
    
    public void agregarObservador(String obs){
        observadores.add(obs);
    }
    
    public void eliminarObservador(String obs){
        System.out.println("Eliminando Observador "+obs);
        if(observadores.remove(obs)){
            System.out.println("-Eliminado Observador "+obs);
        }
        else{
            System.out.println("!No se elimino Observador "+obs);
        }
    }
    
    public void setEstacionSeleccionada(String estacionSel){
        if(!estacionSel.equals(estacionSeleccionada)){
            if(!estacionSeleccionada.equals(Constantes.ESTACION)){
                cliente.enviarTrama(2, "DT,"+Constantes.ESTACION+","+estacionSeleccionada);
            }
            estacionSeleccionada=estacionSel;
        }
    }
}